#ifndef __THREAD_WATCHDOG_H__
#define __THREAD_WATCHDOG_H__

/*******************************************************************************
 * File name  : thread_watchdog.h
 *------------------------------------------------------------------------------
 * Project    : common
 *------------------------------------------------------------------------------
 * Author(s)  : Jimmy.Cui
 *------------------------------------------------------------------------------
 * Copyright (c) 2021 Jimmy.
 * All rights reserved.
 *******************************************************************************/

/********************************************************************************
 * Include section
 *******************************************************************************/
#include <pthread.h>

/********************************************************************************
 * Constants and macros
 *******************************************************************************/

/********************************************************************************
 * Typedefs, structs and enums
 *******************************************************************************/

/**
 * @brief 看门狗状态枚举
 */
typedef enum
{
    E_CLEAN = 0x00,     /* 未喂狗状态 */
    E_FEED_DOG,         /* 已喂狗状态 */
}E_wd_status;

/**
 * @brief 线程看门狗节点结构体
 */
typedef struct _threadWd
{
    E_wd_status eWdStatus;      /* 看门狗状态 */
    struct _threadWd *next;     /* 指向下一个节点的指针 */
}threadWd;

/********************************************************************************
 * Variables
 *******************************************************************************/

/********************************************************************************
 * prototypes of the functions
 *******************************************************************************/

/**
 * @brief 创建线程看门狗节点
 * @param pp 指向线程看门狗指针的指针，用于返回新创建的节点
 * @note 线程安全，支持多线程并发调用
 */
extern void threadWd_Create(threadWd **pp);

/**
 * @brief 喂狗操作，标记线程为活跃状态
 * @param p 线程看门狗节点指针
 * @note 线程安全，支持多线程并发调用
 */
extern void threadWd_FeedDog(threadWd *p);

/**
 * @brief 删除线程看门狗节点
 * @param pp 指向线程看门狗指针的指针，删除后会被设置为NULL
 * @note 线程安全，支持多线程并发调用
 */
extern void threadWd_Exit(threadWd **pp);

/**
 * @brief 检查所有线程看门狗状态
 * @note 如果发现未喂狗的线程，程序会调用exit(-1)退出
 * @note 线程安全，支持多线程并发调用
 */
extern void threadWd_Check(void);

/**
 * @brief 清理所有线程看门狗资源
 * @note 程序退出前调用，释放所有分配的内存
 * @note 线程安全，支持多线程并发调用
 */
extern void threadWd_Cleanup(void);

#endif // __THREAD_WATCHDOG_H__

/*---------------------------------- End of the file ---------------------------------*/

